package com.itpan.Aspect;


import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;


import java.lang.reflect.Field;

@Aspect
@Component
@Slf4j
public class EntityValidationAspect {

//    @Pointcut(value = "execution(* com.itpan.*.*.*(..)")
//    public void myp(){}
//
//
//    // 在执行实体类的 setter 方法之前拦截，并且方法参数带有 @ValidatedField 注解的
////    @Before("myp()")
////    public void validate(JoinPoint joinPoint, ValidatedField validatedField) throws IllegalAccessException {
////        Object value = joinPoint.getArgs()[0]; // 获取方法参数
////        String fieldName = validatedField.fieldName(); // 获取注解中定义的字段名
////        Object fieldValue = getFieldValue(value, fieldName); // 获取字段值
////        System.out.println("被aop拦截了");
////        log.info("uuu");
////        // 如果字段值是字符串类型，进行验证
////        if (fieldValue instanceof String) {
////            String stringValue = (String) fieldValue;
////            if (!isValid(stringValue)) {
////                throw new IllegalArgumentException("字段 " + fieldName + " 的值无效"); // 抛出异常，提示字段值无效
////            }
////        }
////        // 可根据需要添加其他类型的验证逻辑
////    }

    // 定义切入点：拦截实体类的 setter 方法
//    @Pointcut("execution(* com.itpan.Entity.*.set*(..))")
//    public void setterMethods() {}
//
//    // 在执行 setter 方法前拦截，并且方法参数带有 @ValidatedField 注解的
//    @Before("setterMethods() && @annotation(validatedField)")
//    public void validate(ValidatedField validatedField) throws Throwable {
//        // 获取注解中的字段名
//        String fieldName = validatedField.fieldName();
//        // 执行验证逻辑，这里需要根据实际情况获取字段值并进行验证
//        System.out.println("需要验证的字段名：" + fieldName);
//        // 实现验证逻辑...
//    }

    @Pointcut("execution(* com.itpan.Controller.*.*(..))")
    public  void pt(){}

    @Around("pt()")
    public  Object show(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        String name = proceedingJoinPoint.getSignature().getName();
        System.out.println(name+"方法开始执行了");
        long l = System.currentTimeMillis();
        Object[] args = proceedingJoinPoint.getArgs();
        Object proceed = proceedingJoinPoint.proceed(args);
        long l1 = System.currentTimeMillis();
        System.out.println(name+"方法执行完毕用时===>"+(l1-l)+"ms");
        return proceed;
    }

//    @Pointcut("execution(* com.itpan.Entity.*.*(..))\" 或者 \"execution(* com.itpan.Entity.*.get*(..)) || execution(* com.itpan.Entity.*.set*(..))")
//    public  void pt2(){}
//
//    @Before("pt2()")
//    public  void show2(){
//        System.out.println("被aop拦截到了吧");
//    }

    // 使用反射获取对象中的字段值
//    private Object getFieldValue(Object value, String fieldName) throws IllegalAccessException {
//        Class<?> clazz = value.getClass();
//        try {
//            Field field = clazz.getDeclaredField(fieldName);
//            field.setAccessible(true);
//            return field.get(value);
//        } catch (NoSuchFieldException | IllegalAccessException e) {
//            throw new IllegalArgumentException("获取字段值失败", e);
//        }
//    }
//
//    // 针对字符串类型的验证逻辑，这里只是示例，需要根据实际需求实现
//    private boolean isValid(String value) {
//        // 实现字符串值的验证逻辑，例如检查SQL注入、空值等
//        return value != null && !value.isEmpty();
//    }
}
